package main

import "fmt"

// 泛型
func main() {

	strArray := []string{"alen", "wusir"}
	numArray := []int{1, 2}
	floatArray := []float64{1.23, 4.56}
	printStringArray(strArray)
	printIntArray(numArray)
	fmt.Println("==========")
	printArray(strArray)
	printArray(numArray)
	printArray(floatArray)
	fmt.Println("==========")
	printArrays(strArray)
	printArrays(numArray)
	printArrays(floatArray)

}

//　我们不限定他的类型，让调用者自己去定义类型  T
// []T 形式类型  实际类型
/**
 *  内置的泛型类型 any 和 comparable
 *	any 表示 go 里面所有的内置基本类型，等价于 interface{}
 *  comparable  表示go里面所有内置的可比较类型   int uint float bool struct 指针 等一切可以比较的类型
*/
func printArray[T string | int | float64](arr []T) {
	for _, a := range arr {
		fmt.Println(a)
	}
}

func printArrays[T any] (arr []T){
	for _, a := range arr {
		fmt.Println(a)
	}
}

// 以前
func printStringArray(arr interface{}) {
	// 类型断言 x.(T) 就是判断 T 是否实现了 x 的接口，如果实现了，就把x 接口类型具体化为 Ｔ　类型
	for _, a := range arr.([]string) {
		fmt.Println(a)
	}
}

func printIntArray(arr interface{}) {
	// 类型断言 x.(T) 就是判断 T 是否实现了 x 的接口，如果实现了，就把x 接口类型具体化为 Ｔ　类型
	for _, a := range arr.([]int) {
		fmt.Println(a)
	}
}
